//#include <stdio.h>
//int main() {
//	//字符串的结束标志:'\0'
//	// "abcdef”;
//	//'\0'-转义字符-0
//	//0->数字0,'0’->48
//	// 'a' 'b' 'c' '0’'I' '2'
//	//EOF-end of file-文件结束标志,其值为-1
//	return 0;
//}

//注释
//1.代码中有不需要的代码可以直接删除，也可以注释掉
//2.代码中有些代码比较难懂，可以加一下注释文字
//1.c语言风格的注释/*xxxxx*/
//缺陷:不能嵌套注释
//2.C++风格的注释//xxxxxxxxx
//可以注释一行也可以注释多行

//单目操作符
//! 逻辑反操
//- 作负值
//+ 正值
//& 取地址
//sizeof 操作数的类型长度(以字节为单位)
//~ 对一个数的二进制按位取反
//--前置、后置--
//++前置、后置++
//* 间接访问操作符(解引用操作符)
//(类型) 强制类型转换
//#include <stdio.h>
//int main() {
//	//int a = 10,b=10;
//	//int c = a++,e=a;//后置++，先使用，再++
//	//int d = ++b,f=b;//前置++，先++，再使用
//	// int g=(int) 3.14;
//	//printf("c=%d,e=%d\nd=%d,f=%d", c, e, d, f);
//	//return 0;
//}

//关系操作符
//>  >=  <  <=  != 不等于  ==相等
//逻辑操作符
//&& 逻辑与   ||逻辑或
//条件操作符
//exp1?exp2:exp3;   exp1的值为真就执行exp2，否则就执行exp3
//逗号表达式
//exp1,exp2,exp3,....expN
//& . ->

//常见关键字
//auto break case char const continue default do double else enum
//extern float for goto if int 1ong register return short signed
//sizeof static struct switch typedef union unsigned void volatile
//while
//注 :关键字，先介绍下面几个，后期遇到讲解。
//break语句 1.跳出循环语句。2.用于switch case循环
//signed 有符号数，只是在定义数据类型时常常会省略signed
//unsigned 无符号数，不能省
//struct 结构体关键字
/* switch case语句 */
//typedef  类型定义
//union 联合体/共用体
//void  无或空
//static 静态变量
//变量名是不能和关键字同名的

//计算机存储数据
//寄存器
//高速缓存
//内存
//硬盘
//由下往上，运行越快，内存越小

//#include <stdio.h>
//int main() {
//
//	auto int a = 10;
//	//局部变量,即自动变量
//	/*1.新版C++定义auto不能和任何类型进行组合；
//	2.auto x = 14; 表示把x自动转换成整型，归结为 auto 变量名 = 值（可以是基本数据类型）:auto根据后面的值自动把该变量转换成相应的类型。
//	3.大多数以普通声明方式声明的变量都是auto变量, 他们不需要明确指定auto关键字，默认就是auto；
//	4.auto变量在离开作用域是会被程序自动释放，不会发生内存溢出。*/
//
//	//register int a = 1;//这句代码的意思建议把a定义成寄存器变量（这是因为寄存器数量十分有限，当定义过多的寄存器数据时，编译器自己会判断，能不能把a放到寄存器中）
//	////register是寄存器类型，内存很小，但速度快
//
//	//typedef  类型定义-类型重定义
//	typedef unsigned int u_int;
//	//把unsigned int这种类型取了个别名u_int。用此代码后unsigned int num;和u_int num;是同一个意思。
//
//	return 0;
//}
//p4 2;00;00

////static 修饰局部变量,改变的是生命周期
////局部变量的生命周期变长
//#include <stdio.h>
//void test () {
//	int a = 1;
//	static int b = 1;//b是一个静态的局部变量
//	//b没有被销毁。
//	a++, b++;//a:2 2 2 2 2    b:2 3 4 5 6
//	printf("a=%d,b=%d\n", a, b);
//}
//int main() {
//	int i = 0;
//	while (i < 5) {
//		test();
//		i++;
//	}
//	return 0;
//}
//static 修饰全局变量，改变的是作用域
//#include <stdio.h>
//int main() {
//	//extern - 用来声明外部文件的变量
//	extern int g_val;
//	//在add中改int g_val = 2020;为static int g_val = 2020;后，g_val就只能作用于add这个源文件中。别的文件用extern也不行。
//	printf("g_val=%d\n", g_val);
//}
//static 修饰函数，和修饰全局变量类似，改变的是作用域-这种说法不准确
//可以这样说，static修饰函数改变的是函数的链接属性。外部链接属性->内部链接属性

//#define 定义常量和宏
//1.define定义标识符常量
//#define MAX 1000
//2.define 可以定义宏-带参数  //定义函数
//#define ADD(x, y) x+y
//#include <stdio.h>
//int main() {
//	printf("%d", ADD(3, 4));
//}

//指针
//内存是电脑上特别重要的存储器，计算机中所有程序的运行都是在内存中进行的。
//所以为了有效的使用内存，就把内存划分成一个个小的内存单元，每个内存单元的大小是1个字节。
//为了能够有效的访问到内存的每个单元，就给内存单元进行了编号，这些编号被称为该内存单元的地址。
//#include <stdio.h>
//int main() {
//
//	////int a = 10;//向内存申请了4个字节
//	////int* p=&a;//取出a的地址
//	//////指针变量，类型是int* -用来存放地址的变量。
//	//////printf("%p\n", &a);//%p是地址格式，此代码可以看到a的地址
//	//////printf("%p\n", p);
//	////*p=20;//* - 解引用操作符，它的意思是对p进行解引用操作，找到它所指向的对象a
//	////printf("%d", a);
//	////再解释一遍
//	int a = 10;//在内存中创建了一片空间，取名为a,它对应空间的地址假如是000000C527AFF784，里面存的值是10
//	int* p = &a;//在内存中创建了一片空间，取名为p   把a的地址取出来放入p中，即把地址000000C527AFF784存到变量p中
//	*p = 20;//通过p里存放的地址找到a,即*p相当于变量a。
//	return 0;
//}
#include <stdio.h>
int main() {
	char ch = 'w';
	char* pc = &ch;
	*pc = 'a';
	printf("%c\n", ch);
	return 0;
}
//指针大小：在32位计算机中是4个字节，在64位计算机中是8个字节